﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>

//https://www.luogu.com.cn/problem/P2678

using namespace std;

typedef long long LL;
const int N = 5e4 + 10;
int l, n, m;
int a[N];

//// 最短移动距离为x时，移动岩石的个数
//int calc(int x)
//{
//	//使用双指针模拟跳跃过程
//	int i = 0, j = 1;
//	int ret = 0;
//	while (j <= n)
//	{
//
//		if (a[j] - a[i] >= x)
//		{
//			ret += j - i - 1;
//			i = j;
//		}
//		else if(a[j] - a[i] < x)++j;
//	}
//	return ret;
//}
// 
// 当最短跳跃距离为 x 时，移⾛的岩⽯数⽬ 
LL calc(LL x)
{
	LL ret = 0;
	//bool flag = true;
	for (int i = 0; i <= n + 1;)
	{
		int j = i + 1;
		while (j <= n + 1 && a[j] - a[i] < x) j++;
		////若把终点移走，非法
		//if (i <= n && j == n + 2)flag = false;
		ret += j - i - 1;
		i = j;
	}
	//return flag == true ? ret:m+1;
	return ret;
}


int main()
{
	cin >> l >> n >> m;
	for (int i = 1; i <= n; ++i)cin >> a[i];
	a[n + 1] = l;

	//最短移动距离为1
	int left = 1, right = l;
	//二分算法
	while (left < right)
	{
		int mid = (left + right + 1) / 2;
		if (mid == 2)
		{
			int k = 1;
		}
		if (mid == 4)
		{
			int k = 2;
		}
		if (calc(mid) <= m)left = mid;
		else right = mid - 1;

	}
	cout << left << endl;
	return 0;
}